package com.yzh.design.demo.agent;

import com.yzh.design.demo.IUserDao;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;

public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor {
    /**
     * Spring IoC 容器加载 Bean 的定义之后执行自定义的逻辑
     * 在容器加载 Bean 的定义之后，注册一个自定义的 Bean 定义。
     * 该 Bean 定义的详细信息包括了 Bean 类、作用域、构造函数参数等。通过这种方式，我们可以在 Spring IoC 容器初始化过程中，动态地向容器注册所需的 Bean 定义
     * @param beanDefinitionRegistry
     * @throws BeansException
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        //定义一个普通类的 Bean
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        //指定 MapperFactoryBean 类作为 Bean
        genericBeanDefinition.setBeanClass(MapperFactoryBean.class);
        //设置 Bean 的作用域为 Singleton
        genericBeanDefinition.setScope("singleton");
        //将 IUserDao.class 设置为 Bean 的构造函数参数
        genericBeanDefinition.getConstructorArgumentValues().addGenericArgumentValue(IUserDao.class);

        //保存一个 Bean 的定义
        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(genericBeanDefinition, "userDao");
        //将自定义的 Bean 定义注册到 Spring IoC 容器的 Bean Definition Registry 中
        BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, beanDefinitionRegistry);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}
